from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase
import pytest
from httprunner import Parameters


class TestCaseLogin(HttpRunner):
    """  # 单组数据驱动
    @pytest.mark.parametrize('param',Parameters({"username":["admin","admin1","admin2"]}))
    def test_start(self,param):
        super().test_start(param)
    """
    """
    param：形参，和方法换地的参数名字要一样
    Parameters：是httprunner的库，数据驱动的
    username：参数名字
    第一条测试用例，账号是：admin
    第二条测试用例，账号是：admin1
    第三条测试用例，账号是：admin2
    """
    @pytest.mark.parametrize('param',Parameters({"username":['admin',"admin1","admin2"],
                                                 "pwd":['123','1234','Aa123456']}))
    def test_start(self,param):
        super().test_start(param)
    """
    第一条用例：admin，123
    第二条用例：admin，1234
    第三条用例：admin，Aa123456
    第四条用例：admin1，123
    第五条用例：admin1，1234
    第六条用例：admin1，Aa123456
    第七条用例：admin2，123
    第八条用例：admin2，1234
    第九条用例：admin2，Aa123456
    """


    config = Config("这是一条查询用户分组的用例").verify(False)\
        .base_url("http://121.196.200.187:8899")
        # .variables(**{"user":"admin","pwd":"Aa123456"}).\

    """
    verify：参数为False时，表示忽略ssl证书，关于https协议的
    variables：设置全局参数
    base_url：设置全局的地址，后续无需拼接
    """
    teststeps = [ # teststeps，是一个列表，列表里面套的是每一个接口用例
            Step(
                RunRequest("登录") #  RunRequest 接口用例描述信息
                .with_variables(**{"Connection":"keep-alive"}) # with_variables 设置局部变量，仅在当前step中能用
                 .post("${get_url()}") # .post 请求方式
                 .with_headers( #  请求头
                    **{'Host': '121.196.200.187:8899', 'Content-Length': '111',
                       'Accept': 'application/json, text/plain, */*',
                       'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36',
                       'Content-Type': 'application/json;charset=UTF-8', 'Origin': 'http://121.196.200.187:8899',
                       'Referer': 'http://121.196.200.187:8899/admin/login',
                       'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'zh-CN,zh;q=0.9',
                       'Cookie': 'WS_ADMIN_URL=ws://121.196.200.187:8899/notice; WS_CHAT_URL=ws://121.196.200.187:8899/msg; collapsed=false; cb_lang=zh-cn; PHPSESSID=37cdeae5f0a913f3732f5076a6ada7f4',
                       'Connection': '${Connection}'})
                    .with_cookies(**{'WS_ADMIN_URL': 'ws://121.196.200.187:8899/notice', 'WS_CHAT_URL': 'ws://121.196.200.187:8899/msg',
                                     'collapsed': 'false', 'cb_lang': 'zh-cn', 'PHPSESSID': '37cdeae5f0a913f3732f5076a6ada7f4'}) # 请求cookies
                 .with_json({'account': '${username}', 'pwd': '${pwd}', 'key': '656585a0dc705', 'captchaType': 'blockPuzzle', 'captchaVerification': ''}) # with_json: json格式传参
                 .extract() # 后面跟取出响应结果的表达式
                  .with_jmespath("body.data.token","my_token") # 提取token响应内容
                 .validate()
                 .assert_equal("status_code", 200)
                 .assert_equal('headers."Content-Type"', "application/json; charset=utf-8")
                 .assert_equal('headers."Connection"',"keep-alive")
                 .assert_equal("body.status", 200)
                 .assert_equal("body.msg", "success")
                 .assert_equal("body.data.menus[0].path","/admin/home/")
            ),
]